package br.com.livrossociais.dao.impl.hibernate;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;

import org.hibernate.Query;

import br.com.livrossociais.dao.IUsuarioDAO;
import br.com.livrossociais.jpa.dao.UsuarioJPA;
import br.com.livrossociais.jpa.dao.UsuarioJPAImpl;
import br.com.livrossociais.model.Mensagem;
import br.com.livrossociais.model.Usuario;

public class UsuarioDAOHibernate implements IUsuarioDAO {
	private UsuarioJPA userDAO;

	public UsuarioDAOHibernate() {
		// TODO Auto-generated constructor stub
		this.userDAO = new UsuarioJPAImpl();
	}

	@Override
	public Mensagem cadastrar(Usuario user) {
		// TODO Auto-generated method stub
		if (this.buscarPorUsername(user) == null) {
			if (this.salvar(user)) {
				return Mensagem.Save_Efetuado;
			} else {
				return Mensagem.Erro_Save;
			}
		} else {
			return Mensagem.Usuario_Ja_Existe;
		}
	}

	@Override
	public boolean atualizar(Usuario user) {
		return this.salvar(user);
	}

	@Override
	public Usuario buscar(Usuario user) {
		// TODO Auto-generated method stub
		if (user.getUsername() != null || !user.getUsername().equals("")) {
			return this.buscarPorUsername(user);
		} else if (user.getId() > 0) {
			return this.buscarPorId(user);
		} else {
			return null;
		}
	}

	private boolean salvar(Usuario user) {
		try {
			userDAO.beginTransaction();
			userDAO.save(user);
			userDAO.commit();
		} catch (Exception e) {
			return false;
		} finally {
			userDAO.close();
		}
		return true;
	}

	private Usuario buscarPorUsername(Usuario user) {
		String username = user.getUsername();
		EntityManagerFactory emf = Persistence
				.createEntityManagerFactory("dev");
		EntityManager em = emf.createEntityManager();
		try {
			user = (Usuario) em.createNamedQuery("Usuario.findByUsername")
					.setParameter("username", username).getSingleResult();
		} catch (Exception e) {
			return null;
		} finally {
			em.close();
		}
		return user;
	}

	private Usuario buscarPorId(Usuario user) {
		Long id = user.getId();
		EntityManagerFactory emf = Persistence
				.createEntityManagerFactory("dev");
		EntityManager em = emf.createEntityManager();
		Query consulta = (Query) em
				.createQuery("from Usuario where id = :codigo");
		consulta.setLong("codigo", id);
		user = (Usuario) consulta.uniqueResult();
		em.close();
		return user;
	}
}
